package main

import "fmt"

// 判断并返回一个数字是几位数, digit 从 1 开始计数
func judgeDigit(number, digit int) int {
	// 定义一个计数器
	counter := number / 10
	if counter != 0 {
		// 继续计算位数
		digit++
		return judgeDigit(counter, digit)
	}

	// 返回位数
	return digit
}

// 拼接出一个指定长度的字符串
func genStr(n int) string {
	var s string

	for i := 1; i <= n; i++ {
		s += " "
	}

	return s
}

func printTriangle(level int) {
	switch {
	case level <= 0:
		panic("error")
	case level == 1:
		fmt.Println(1)
		return
	}

	// 创建 [level][level]int 的二维切片
	var arr = make([][]int, level)
	for i := range arr {
		arr[i] = make([]int, level)
	}

	// count 为 a[i][j] 的值
	count := 1

	// 初始化二维切片
	for j := level - 1; j >= 0; j-- {
		for i := 0; i <= level-1; i++ {
			if i >= count-1 {
				arr[i][j] = count
			}
		}
		count++
	}

	// 第 j 列的宽度为 judgeDigit(arr[level-1][j], 1) + 1
	for i := 0; i < level; i++ {
		for j := 0; j < level; j++ {
			var s string
			// width 为第 j 列的宽度
			width := judgeDigit(arr[level-1][j], 1) + 1
			s = genStr(width)

			if arr[i][j] == 0 {
				// 元素为 0 时，打印：对应长度的空串
				fmt.Print(s)
			} else {
				// 元素不为 0 时, 打印：数字 + " "
				fmt.Print(arr[i][j], " ")
			}
		}
		fmt.Println()
	}
}

func main() {
	printTriangle(30)
	// fmt.Printf("%*s", 4, "1")
}
